package com.itany.corejava.code14_lambda;

import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author MissChen
 * @date 2024年03月25日 15:04
 */
public class Test06_方法引用 {
    public static void main(String[] args) {
        // Lambda表达式的另一种表现形式
        // Lambda表达式指向一个已经存在的方法
        // 语法
        //     对象::实例方法名
        //     类::静态方法名
        //     类::实例方法名

        // Consumer<String> c=new Consumer<String>() {
        //         @Override
        //         public void accept(String s) {
        //             System.out.println(s);
        //         }
        // };
        // c.accept("aaaa");

        Consumer<String> c=s->System.out.println(s);
        c.accept("hello");

        //对象::println
        //本质上将方法整体赋值给变c2，并没有执行方法，因此没有打印效果
        // 想要执行方法，通过调用才能执行
        Consumer<String> c2=System.out::println;
        c2.accept("哈哈哈");


        User user=new User();
        // Consumer<String> c22=new Consumer<String>() {
        //     @Override
        //     public void accept(String s) {
        //         user.setUsername(s);
        //     }
        // };
        // c22.accept("admin");
        // System.out.println(user);

        Consumer<String> c23=user::setUsername;
        c23.accept("yoi");
        System.out.println(user);


        // Supplier<String> s=new Supplier<String>() {
        //     @Override
        //     public String get() {
        //         return user.getUsername();
        //     }
        // };
        // System.out.println(s.get());
        Supplier<String> s=user::getUsername;
        System.out.println(s.get());

        // 类名::静态方法名
        Supplier<String> s2=User::hello;
        System.out.println(s2.get());


        Predicate<String> pp=new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.equals("aa");
            }
        };
        System.out.println(pp.test("bb"));


        //对象::实例方法名
        Predicate<String> p="hhh"::equals;
        boolean flag=p.test("aa");
        System.out.println(flag);


        // 类::实例方法名
        // JDK8中提供了BiPredicate类型，专门用于处理类似的操作
        // 此时两个泛型分别对应方法的调用者与方法的参数
        // 第一个泛型是调用者类型
        // 第二个泛型是方法参数的类型
        //无法确定具体的调用者是谁，但是我能知道的一定是字符串
        //此时可以使用类::实例方法方法名的方式来进行定义
        BiPredicate<String,String> p23=new BiPredicate<String, String>() {
            @Override
            public boolean test(String s, String s2) {
                return s.equals(s2);
            }
        };
        System.out.println(p23.test("aaa","aaa"));


        // 类::实例方法名
        BiPredicate<String,String> p24=String::equals;
        boolean flag2=p24.test("a","a");
        System.out.println(flag2);
    }

}
